package cn.micai.base.task;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/**
 * @Auther: zhaoxinguo
 * @Date: 2018/7/9 16:54
 * @Description: 使用Executor实现的Web Server==使用线程池的 Web Server
 *
 * Executors创建线程工厂方法详解：
 * 1.newFixedThreadPool();创建一个定长的线程池，每当提交一个任务就创建一个线程，直到达到池的最大长度，这时线程池会保持长度不变(如果
 * 一个线程由于非预期的Exception而结束，线程池会补充一个新的线程)
 *
 * 2.newCachedThreadPool();创建一个可缓存的线程池，如果当前线程池的长度超过了处理的需要时，它可以灵活地回收空闲的线程，当需求增加时，
 * 它可以灵活地添加新的线程，而并不会对池的长度作任何限制
 *
 * 3.newSingleThreadExecutor();创建一个单线程化的线程池，它只创建唯一的工作者线程来执行任务，如果这个线程异常结束，会有另一个取代它，
 * 线程池会保证任务依照队列所规定的顺序(FIFO,LIFO,优先级)执行
 *
 * 4.newScheduledThreadPool();创建一个定长的线程池，而且支持定时的以周期性的任务执行
 *
 */
public class TaskExecutionWebServer {

    private static final int NTHREADS = 10;

//    private static final Executor executor = Executors.newFixedThreadPool(NTHREADS);
    private static final Executor executor = Executors.newFixedThreadPool(NTHREADS);

    public static void main(String [] args) {
        try {
            ServerSocket socket = new ServerSocket(80);
            while (true) {
                final Socket connection = socket.accept();
                Runnable task = new Runnable() {
                    @Override
                    public void run() {
                        handleRequest(connection);
                    }
                };
                executor.execute(task);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static void handleRequest(Socket connection) {

    }
}
